XML (eXtensible Markup Languaje) es un lenguaje de marcado, pero a diferencia de HTML que posee un conjunto de etiquetas definidas, en XML el conjunto de etiquetas es definido por el usuario.
El objetivo de esta tecnología es poder intercambiar información entre aplicaciones de manera "legible para el ser humano". Sin embargo, uno de los problemas de XML es que no incluye información semántica en sus elementos.
XML es la base del desarrollo de aplicaciones y servicios web SOAP.
Un documento XML está compuesto por tres partes:
Cabecera (declaración XML): Nos indica que en efecto es un XML, la versión y la codificación del documento, etc.
xxxxxxxxxx11 Raíz (root): Al seguir una estructura arbórea, es necesario establecer un elemento raíz del que colgarán el resto de elementos y atributos.
Solo existe un único elemento root.
Dentro de la raíz de un documento XML podemos diferenciar tres tipos de elementos:
Elementos: Son objetos que están encerrados en una etiqueta y no tienen hijos.
Los elementos XML pueden tener contenido (más elementos, caracteres, o ambos a la vez), o bien ser elementos vacíos.
Siempre empiezan con una <etiqueta> que puede contener atributos o no, y termina con una </etiqueta> que debe tener el mismo nombre.
xxxxxxxxxx21<nombre>Fulano Mengánez</nombre> <!-- Elemento -->2<aviso tipo="emergencia" gravedad="mortal">Que no cunda el pánico</aviso> <!-- Elemento con atributos -->Un elemento vacío, es el que no tiene contenido. Al no tener una etiqueta de "cierre" que delimite un contenido, se utiliza la forma <etiqueta/>.
xxxxxxxxxx11<identificador DNI="23123244"/>Contenedores: Se trata de una extensión de los elementos, pues son elementos que a su vez contienen otros elementos y otros contenedores.
Atributos: Forman parte de los elementos y permiten definir mejor una característica o propiedad de un elemento. Mientras que los elementos pueden contener otros elementos, los atributos solo pueden contener texto.
xxxxxxxxxx11<chiste tipo="vascos" calidad="bueno">Esto es un dia que Patxi y Josu van paseando</chiste> A veces, un elemento con contenido, puede modelarse como un elemento vacío con atributos. Un concepto se puede representar de muy diversas formas, pero una vez elegida una, es aconsejable fijarla en el DTD, y usar siempre la misma consistentemente dentro de un documento XML.
xxxxxxxxxx11<gato><nombre>Micifú</nombre><raza>Persa</raza></gato>
Materiales (opcional).
La validación de documentos XML se utiliza para comprobar que el conjunto de etiquetas utilizado es correcto y que la información utilizada de tipos también lo es.
Para ser aceptado, un XML tiene que cumplir dos condiciones:
Estar bien formado: ser sintácticamente correcto.
Ser válido.
Existen dos métodos para validar documentos XML:
DTD (Data Type Definition): Es la opción más anticuada y menos habitual.
En un DTD podemos distinguir los siguientes elementos:
ELEMENT: Define los tipos de elementos que puede contener el documento XML.
ATTLIST: Permite especificar los atributos de un elemento.
xxxxxxxxxx91<!DOCTYPE note2[3<!ELEMENT book (title,author,illustrator,ediciones,editor,isbn)> 4<!ELEMENT title (#PCDATA)>5<!ELEMENT author (#PCDATA)>6<!ELEMENT illustrator (#PCDATA)>7<!ELEMENT ediciones (edicion)>8<!ELEMENT edicion (#PCDATA)> 9]>
XML Schema (Esquema XML): Define la estructura al igual que una DTD, pero nos da más opciones y es más preciso.
Están escritos en XML, no es necesario conocer otro lenguaje.
Admiten tipos de datos (enteros, fechas, secuencias…).
Los esquemas XML admiten espacios de nombres.
xxxxxxxxxx141 2<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">3 4 <xs:element name="note">5 <xs:complexType>6 <xs:sequence>7 <xs:element name="to" type="xs:string"/>8 <xs:element name="from" type="xs:string"/>9 <xs:element name="heading" type="xs:string"/>10 <xs:element name="body" type="xs:string"/>11 </xs:sequence>12 </xs:complexType>13 </xs:element>14</xs:schema>
xxxxxxxxxx321 <!-- CABECERA -->2<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">3 4 <xs:element name="shiporder"> <!--ELEMENTO GLOBAL DE TIPO COMPLEJO-->5 <xs:complexType> <!--DEFINE EL TIPO COMPLEJO (OBJETO)-->6 <xs:sequence> <!--SECUENCIA DE ELEMENTOS QUE TIENE-->7 <xs:element name="orderperson" type="xs:string"/> <!--ELEMENTO DEL TIPO STRING-->8 <xs:element name="shipto"> <!--ELEMENTO DEL TIPO COMPLEJO-->9 <xs:complexType> <!--DEFINE EL TIPO COMPLEJO (OBJETO)-->10 <xs:sequence> <!--SECUENCIA DE ELEMENTOS QUE TIENE-->11 <xs:element name="name" type="xs:string"/> <!--ELEMENTO DEL TIPO STRING-->12 <xs:element name="address" type="xs:string"/> <!--ELEMENTO DEL TIPO STRING-->13 <xs:element name="city" type="xs:string"/> <!--ELEMENTO DEL TIPO STRING-->14 <xs:element name="country" type="xs:string"/> <!--ELEMENTO DEL TIPO STRING-->15 </xs:sequence> <!--CIERRE SEQUENCE-->16 </xs:complexType> <!--CIERRE COMPLEXTYPE-->17 </xs:element> <!--CIERRE ELEMENT-->18 <xs:element name="item" maxOccurs="unbounded"> <!--ELEMENTO DEL TIPO COMPLEJO-->19 <xs:complexType> <!--DEFINE EL TIPO COMPLEJO (OBJETO)-->20 <xs:sequence> <!--SECUENCIA DE ELEMENTOS QUE TIENE-->21 <xs:element name="title" type="xs:string"/> <!--ELEMENTO DEL TIPO STRING-->22 <xs:element name="note" type="xs:string" minOccurs="0"/> <!--ELEMENTO DEL TIPO STRING-->23 <xs:element name="quantity" type="xs:positiveInteger"/> <!--ELEMENTO DEL TIPO STRING-->24 <xs:element name="price" type="xs:decimal"/> <!--ELEMENTO DEL TIPO STRING-->25 </xs:sequence> <!--CIERRE SEQUENCE-->26 </xs:complexType> <!--CIERRE COMPLEXTYPE-->27 </xs:element> <!--CIERRE ELEMENT-->28 </xs:sequence> <!--CIERRE SEQUENCE-->29 <xs:attribute name="orderid" type="xs:string" use="required"/> <!--ATRIBUTO-->30 </xs:complexType>31 </xs:element>32</xs:schema>
xxxxxxxxxx241 2
3<shiporder orderid="889923"4xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"5xsi:noNamespaceSchemaLocation="shiporder.xsd">6 <orderperson>John Smith</orderperson>7 <shipto>8 <name>Ola Nordmann</name>9 <address>Langgt 23</address>10 <city>4000 Stavanger</city>11 <country>Norway</country>12 </shipto>13 <item>14 <title>Empire Burlesque</title>15 <note>Special Edition</note>16 <quantity>1</quantity>17 <price>10.90</price>18 </item>19 <item>20 <title>Hide your heart</title>21 <quantity>1</quantity>22 <price>9.90</price>23 </item>24</shiporder>
Existen varios lenguajes que utilizan DOM para poder consultar y transformar la información en formato XML:
XPath: Lenguaje que permite navegar por documentos XML.
xxxxxxxxxx201 2
3<bookstore>4
5 <book category="cooking">6 <title lang="en">Everyday Italian</title>7 <author>Giada De Laurentiis</author>8 <year>2005</year>9 <price>30.00</price>10 </book>11 12
13 <book category="children">14 <title lang="en">Harry Potter</title>15 <author>J K. Rowling</author>16 <year>2005</year>17 <price>29.99</price>18 </book>19 20</bookstore>
| Expresión XPath | Result |
|---|---|
| /bookstore/book[1] | Selecciona el primer element ‘book’ que sea hijo de ‘bookstore’ |
| /bookstore/book[last()] | Selecciona el último ‘book’ hijo de ‘bookstore’ |
| /bookstore/book[last()-1] | Selecciona el penúltimo ‘book’ hijo de ‘bookstore’ |
| /bookstore/book[position()<3] | Selecciona los dos primeros ‘book’ hijos de ‘bookstore’ |
| //title[@lang] | Selecciona todos los ‘title’ que tengan atributo ‘lang’ |
| //title[@lang='en'] | Selecciona todos los ‘title’ que tengan atributo ‘lang’ con valor ‘en’ |
| /bookstore/book[price>35.00] | Selecciona todos los ‘book’ dentro de ‘bookstore’ cuyo atributo precio exista y sea mayor a 35 |
| /bookstore/book[price>35.00]/title | Selecciona el ‘title’ de todos los ‘book’ dentro de ‘bookstore’ cuyo atributo precio exista y sea mayor a 35 |
XQuery: Lenguaje de consultas para documentos XML.
Es soportado por la mayoría de bases de datos relacionales.
xxxxxxxxxx41for $x in doc("books.xml")/bookstore/book2where $x/price>303order by $x/title4retur $x/title
SQL/XML (SQLX): Estándar para generar documentos XML a partir de una base de datos relacional.
Soportado por Oracle Database y Microsoft SQL Server (FOR XML). MySQL tiene algo similar, pero no igual de potente.
Extremadamente útil si queremos que la capa de aplicación reciba directamente datos formateados correctamente.
Consulta en SQL:
xxxxxxxxxx21SELECT COUNTRY_NAME, REGION_ID, COUNTRY_ID2FROM COUNTRIES;Consulta en XML:
xxxxxxxxxx81SELECT2 XMLELEMENT("countryXml",3 XMLATTRIBUTES(4 country_name AS "name",5 region_id AS "code",6 country_id AS "id"))7 AS CountryXml8FROM countries;